﻿#ifndef H_RESIZE_PROC_H
#define H_RESIZE_PROC_H

#include <QObject>
#include <QWidget>
#include <QPoint>
#include <QtGlobal>

class HGxBaseWindow;

/**
* @class	GxResizeProc
* @brief	通用窗口基类的实现类
* @note
* @author	H00015
**/
class GxResizeProc : public QObject
{
	Q_OBJECT
	enum MouseStyle { NORMAL, LEFT, TOP, RIGHT, BOTTOM, TOPLEFT, TOPRIGHT, BOTTOMRIGHT, BOTTOMLEFT };

public:
	GxResizeProc(QWidget *parent);

	/**
	 * @brief	设置窗口是否可通过鼠标缩放。
	 * @param	resizable [in] 是否可通过鼠标缩放
	 */
	void setResizable(bool resizable);

	/**
	 * @brief   设置窗口通过鼠标缩放的边距。
	 * @param   width [in] 边距
	 */
	void setResizeBorderWidth(int width);

protected:
	/**
	 * @brief	事件过滤器
	 * @param	watched [in] 触发事件的对象
	 * @param	watched [in] 触发的对象
	 */
	bool eventFilter(QObject *watched, QEvent *event) override;

private:
	/**
	 * @brief	判断是否可移动
	 * @param	p [in] 鼠标在窗口中的位置
	 */
	bool movable(const QPoint& p);

		/**
	 * @brief	改变鼠标样式
	 * @param	pos [in] 鼠标在窗口中的位置
	 */
	void changeMouseStyle(const QPoint &pos);

public:
	bool m_bResizable;				// 标记是否可缩放

	int m_iDragMargin;				// 可缩放的边距
	bool m_bMousePressed;			// 标记鼠标是否按下
	QPoint m_mousePos;				// 标记鼠标按下的坐标
	MouseStyle m_mouseStyle;		// 鼠标样式
	int m_iDragXPadding;			// 拖动时记录x边距
	int m_iDragYPadding;			// 拖动时记录y边距
	QPoint m_topLeftPos;			// 记录左上角位置
	QPoint m_bottomRightPos;		// 记录右下角位置

};

#endif // !H_RESIZE_PROC_H
